0932a582670f86699c242ebab85fbdcfc34f8a9f,cdi-microservice-provider/src/main/java/io/silverware/microservices/providers/cdi/CdiMicroserviceProvider.java,CdiMicroserviceProvider,lookupMicroservice,#MicroserviceMetaData#,106
Before Change
return Collections.singleton(beanManager.getReference(theBean, type, beanManager.createCreationalContext(theBean)));
} else if (type.isInterface() && !name.equals(theBean.getName())) {
if (qualifiers.stream().filter(q -> q.annotationType().getName().equals("Default")).count() == 0) { // we have a qualifier match
return Collections.singleton(beanManager.getReference(theBean, type, beanManager.createCreationalContext(theBean)));
}
}
}
After Change
final Class<?> type = microserviceMetaData.getType();
final Set<Annotation> qualifiers = microserviceMetaData.getQualifiers();
final Set<Object> matchingBeansByName = new HashSet<>();
final Set<Object> matchingBeansByType = new HashSet<>();
/*
We are in search for a CDI bean that meets the provided meta-data.
Input and corresponding output is as follows:
* name specified in MicroserviceReference or derived from data type (both class or interface)
* beans having the same name in Microservice annotation
* beans having the same name according to CDI
* the injection point is interface and name matches interface type name
* beans implementing the interface and matching the qualifiers
In all cases, there must be precisely one result or an error is thrown.
*/
final BeanManager beanManager = ((BeanManager) context.getProperties().get(BEAN_MANAGER));
Set<Bean<?>> beans = beanManager.getBeans(type, qualifiers.toArray(new Annotation[qualifiers.size()]));
for (Bean<?> bean : beans) {
if (bean.getBeanClass().isAnnotationPresent(Microservice.class) && !(bean instanceof MicroserviceProxyBean)) {
final Bean<?> theBean = beanManager.resolve(Collections.singleton(bean));
final Microservice microserviceAnnotation = theBean.getBeanClass().getAnnotation(Microservice.class);
if (name != null) {
if ((!microserviceAnnotation.value().isEmpty() && name.equals(microserviceAnnotation.value())) ||
(microserviceAnnotation.value().isEmpty() && name.equals(theBean.getName()))) {
matchingBeansByName.add(beanManager.getReference(theBean, type, beanManager.createCreationalContext(theBean)));
} else if (type.isAssignableFrom(theBean.getBeanClass())) {
final Set<Annotation> qualifiersToCompare = new HashSet<>(theBean.getQualifiers());
qualifiers.stream().forEach(qualifiersToCompare::remove);
if (qualifiersToCompare.size() == 0) {
matchingBeansByType.add(beanManager.getReference(theBean, type, beanManager.createCreationalContext(theBean)));
}
}
}